#include "nonlinear_transform.h"
#include "linear_transform.h"
#include <algorithm>

namespace util {

  //
  // util::NonlinearTransform
  //

  NonlinearTransform::NonlinearTransform(const TContainer &Transform_)
  : mTransform(Transform_)
  {
    if (mTransform.size() < 2)
    {
      mTransform.insert(TPair(0.0, 0.0));
      mTransform.insert(TPair(1.0, 1.0));
    }
    else
      mTransform = Transform_;
  }

  const NonlinearTransform::TContainer & NonlinearTransform::GetTransform() const
  {
    return mTransform;
  }

  NonlinearTransform::result_type NonlinearTransform::operator()(argument_type Val_) const
  {
    using namespace std;

    TContainer::const_iterator it = lower_bound(mTransform.begin(), mTransform.end(), TPair(Val_, 0));
    if (it == mTransform.end())
      --(--it);
    else
      if (it != mTransform.begin())
        --it;
    const TPair pt1 = *(it);
    const TPair pt2 = *(++it);

    return LinearTransform(pt1, pt2)(Val_);
  }
} // namespace util {